home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
doom
/
suckmods.zip
/
SUCK05
/
SRC
/
STATUS.QC
< prev
next >
Wrap
Text File
|
1997-05-11
|
15KB
|
537 lines
// The CTF status bar, by Suck (Nat Friedman)
// This file may not be redistributed without the accompanying GNU Public License.
// Let me just clear up one thing about the way this works: Basically, a centerprint
// packet consists of a byte identifying it as a centerprint (26 decimal), followed
// by a zero-terminated string. In order to construct this in a piece-wise manner,
// which is what the status bar does, we _cannot_ use WriteString because some silly
// ass decided that this should null-terminate the string, reducing the flexibility
// of the function by orders of magnitude. So, I wanted to write 4 bytes of the
// string at a time using WriteLong(), but for whatever reason, the high byte is always
// corrupted, so I write 2 bytes at a time using WriteShort(), and rendering my code
// somewhat hard to read or understand at first pass.
// Prototypes. Function descriptions can be found with their respective functions.
void() bottomline;
void(float f) printnum;
void() bottomline;
void(float r) printrune;
// Globals
float team1total;
float team2total;
float totallastcomputed;
// Print the status bar or any special messages for client "self"
void() printstatus =
{
local float winner, spread;
local entity p;
// Set the entity for the unicast Write*()s
msg_entity=self;
// 26 == SVC_CENTERPRINT
WriteByte(MSG_ONE, 26);
// Give us enough newlines to get to the bottom line. msg_center
// is used for a special message which needs to be printed in the
// center of the screen, like a rune notification.
if (!self.msg_center)
bottomline();
self.msg_center=0;
// Print any pending message
if (self.msg_pending)
{
WriteString(MSG_ONE, self.msg_string);
self.msg_pending=0;
return;
}
// Calculate the team scores.
if (totallastcomputed < (time - 2))
{
totallastcomputed=time;
team1total = team2total = 0;
p = find(world, classname, "player");
while (p != world) {
if (p.lastteam == TEAM_COLOR1 + 1)
{
if (teamplay&TEAM_CAPTURE_UNIF)
{
if (p.frags > team1total)
team1total=p.frags;
}
else
team1total = team1total + p.frags;
}
else if (p.lastteam == TEAM_COLOR2 + 1)
if (teamplay&TEAM_CAPTURE_UNIF)
{
if (p.frags>team2total)
team2total=p.frags;
}
else
team2total = team2total + p.frags;
p = find(p, classname, "player");
}
}
// Print the player's rune name as the first entry in the status
// bar.
printrune(self.rune_num);
// Space
WriteByte(MSG_ONE, 32);
// "Kills:"
WriteShort(MSG_ONE, -5685);
WriteShort(MSG_ONE, -4884);
WriteShort(MSG_ONE, 15091);
printnum(self.num_kills);
// Space
WriteByte(MSG_ONE, 32);
// "Deaths:"
WriteShort(MSG_ONE, -6716);
WriteShort(MSG_ONE, -2847);
WriteShort(MSG_ONE, -3096);
WriteByte(MSG_ONE, 58);
printnum(self.num_deaths);
// Space
WriteByte(MSG_ONE, 32);
if (team1total == team2total)
{
// "Tie "
WriteShort(MSG_ONE, -5676);
WriteShort(MSG_ONE, 8421);
}
else if (team1total > team2total)
{
// "Red "
WriteShort(MSG_ONE, -6702);
WriteShort(MSG_ONE, 8420);
}
else
{
// "Blue"
WriteShort(MSG_ONE, -4926);
WriteShort(MSG_ONE, -6667);
}
spread=fabs(team1total-team2total);
printnum(spread);
// Newline, EOL
WriteByte(MSG_ONE, 10);
WriteByte(MSG_ONE, 0);
};
// This is the function you should use in place of centerprint if
// you need to send a message to the client. Note that the message
// will appear on the bottom line unless you do something like this:
// self.msg_center=1;
// clientmsg(self, "Something important has happened!\n");
void(entity p, string st) clientmsg =
{
if (st == "")
{
p.msg_center=0;
return;
}
p.msg_pending=1;
p.msg_string=st;
};
// Print the name of the rune. This is always 11 characters long.
void(float r) printrune =
{
if (r==ITEM_RUNE_RESIST) {
// Earth Magic
WriteShort(MSG_ONE, 24901);
WriteShort(MSG_ONE, 29810);
WriteShort(MSG_ONE, 8296);
WriteShort(MSG_ONE, 24909);
WriteShort(MSG_ONE, 26983);
WriteByte(MSG_ONE, 99);
return;
}
else if (r==ITEM_RUNE_DBLDMG) {
// Black Magic
WriteShort(MSG_ONE, 27714);
WriteShort(MSG_ONE, 25441);
WriteShort(MSG_ONE, 8299);
WriteShort(MSG_ONE, 24909);
WriteShort(MSG_ONE, 26983);
WriteByte(MSG_ONE, 99);
return;
}
else if (r==ITEM_RUNE_HASTE) {
// Hell Magic
WriteShort(MSG_ONE, 25928);
WriteShort(MSG_ONE, 27756);
WriteShort(MSG_ONE, 19744);
WriteShort(MSG_ONE, 26465);
WriteShort(MSG_ONE, 25449);
WriteByte(MSG_ONE, 32);
return;
}
else if (r==ITEM_RUNE_REGEN) {
// Elder Magic
WriteShort(MSG_ONE, 27717);
WriteShort(MSG_ONE, 25956);
WriteShort(MSG_ONE, 8306);
WriteShort(MSG_ONE, 24909);
WriteShort(MSG_ONE, 26983);
WriteByte(MSG_ONE, 99);
return;
}
else if (r==ITEM_RUNE_PRIEST) {
// Priest Rune
WriteShort(MSG_ONE, 29264);
WriteShort(MSG_ONE, 25961);
WriteShort(MSG_ONE, 29811);
WriteShort(MSG_ONE, 21024);
WriteShort(MSG_ONE, 28277);
WriteByte(MSG_ONE, 101);
return;
}
else if (r==ITEM_RUNE_VAMPIRE) {
// Vampire
WriteShort(MSG_ONE, 24918);
WriteShort(MSG_ONE, 28781);
WriteShort(MSG_ONE, 29289);
WriteShort(MSG_ONE, 8293);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
return;
}
else if (r==ITEM_RUNE_CASTLE) {
// Castle Rune
WriteShort(MSG_ONE, 24899);
WriteShort(MSG_ONE, 29811);
WriteShort(MSG_ONE, 25964);
WriteShort(MSG_ONE, 21024);
WriteShort(MSG_ONE, 28277);
WriteByte(MSG_ONE, 101);
return;
}
else if (r==ITEM_RUNE_SIEGE) {
// Siege Rune
WriteShort(MSG_ONE, 26963);
WriteShort(MSG_ONE, 26469);
WriteShort(MSG_ONE, 8293);
WriteShort(MSG_ONE, 30034);
WriteShort(MSG_ONE, 25966);
WriteByte(MSG_ONE, 32);
return;
}
else if (r==ITEM_RUNE_HERMES) {
// Hermes
WriteShort(MSG_ONE, 25928);
WriteShort(MSG_ONE, 28018);
WriteShort(MSG_ONE, 29541);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_VULCAN) {
// Vulcan
WriteShort(MSG_ONE, 30038);
WriteShort(MSG_ONE, 25452);
WriteShort(MSG_ONE, 28257);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_MARS) {
// Mars
WriteShort(MSG_ONE, 24909);
WriteShort(MSG_ONE, 29554);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_POSEIDON) {
// Poseidon
WriteShort(MSG_ONE, 28496);
WriteShort(MSG_ONE, 25971);
WriteShort(MSG_ONE, 25705);
WriteShort(MSG_ONE, 28271);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_LOKI) {
WriteShort(MSG_ONE, 28492);
WriteShort(MSG_ONE, 26987);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_WENDIGO) {
WriteShort(MSG_ONE, 25943);
WriteShort(MSG_ONE, 25710);
WriteShort(MSG_ONE, 26473);
WriteShort(MSG_ONE, 8303);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_THOR) {
WriteShort(MSG_ONE, 26708);
WriteShort(MSG_ONE, 29295);
WriteShort(MSG_ONE, 20512);
WriteShort(MSG_ONE, 30575);
WriteShort(MSG_ONE, 29285);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_WOLVERINE) {
WriteShort(MSG_ONE, 28503);
WriteShort(MSG_ONE, 30316);
WriteShort(MSG_ONE, 29285);
WriteShort(MSG_ONE, 28265);
WriteShort(MSG_ONE, 8293);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_WEREWOLF) {
WriteShort(MSG_ONE, 25943);
WriteShort(MSG_ONE, 25970);
WriteShort(MSG_ONE, 28535);
WriteShort(MSG_ONE, 26220);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_WITCH) {
WriteShort(MSG_ONE, 26967);
WriteShort(MSG_ONE, 25460);
WriteShort(MSG_ONE, 8296);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_VIKING) {
WriteShort(MSG_ONE, 26966);
WriteShort(MSG_ONE, 26987);
WriteShort(MSG_ONE, 26478);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_STORMCROW) {
WriteShort(MSG_ONE, 29779);
WriteShort(MSG_ONE, 29295);
WriteShort(MSG_ONE, 17261);
WriteShort(MSG_ONE, 28530);
WriteShort(MSG_ONE, 8311);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_POCAHONTAS) {
WriteShort(MSG_ONE, 28496);
WriteShort(MSG_ONE, 24931);
WriteShort(MSG_ONE, 28520);
WriteShort(MSG_ONE, 29806);
WriteShort(MSG_ONE, 29537);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_ARTHUR)
{
WriteShort(MSG_ONE, 26955);
WriteShort(MSG_ONE, 26478);
WriteShort(MSG_ONE, 16672);
WriteShort(MSG_ONE, 29810);
WriteShort(MSG_ONE, 30056);
WriteByte(MSG_ONE, 114);
}
else if (r == ITEM_RUNE_GOLOM)
{
WriteShort(MSG_ONE, 28487);
WriteShort(MSG_ONE, 28524);
WriteShort(MSG_ONE, 8301);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_SAMURAI)
{
WriteShort(MSG_ONE, 24915);
WriteShort(MSG_ONE, 30061);
WriteShort(MSG_ONE, 24946);
WriteShort(MSG_ONE, 8297);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_SHYLOCK)
{
WriteShort(MSG_ONE, 26707);
WriteShort(MSG_ONE, 27769);
WriteShort(MSG_ONE, 25455);
WriteShort(MSG_ONE, 8299);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_IFRITE)
{
WriteShort(MSG_ONE, 26185);
WriteShort(MSG_ONE, 26994);
WriteShort(MSG_ONE, 25972);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_SARGON)
{
WriteShort(MSG_ONE, 24915);
WriteShort(MSG_ONE, 26482);
WriteShort(MSG_ONE, 28271);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_KIZI)
{
WriteShort(MSG_ONE, 26955);
WriteShort(MSG_ONE, 27002);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_MONK)
{
WriteShort(MSG_ONE, 28493);
WriteShort(MSG_ONE, 27502);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_ANKH)
{
WriteShort(MSG_ONE, 28225);
WriteShort(MSG_ONE, 26731);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_NINJA)
{
WriteShort(MSG_ONE, 26958);
WriteShort(MSG_ONE, 27246);
WriteShort(MSG_ONE, 8289);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_SAMURAI)
{
WriteShort(MSG_ONE, 24915);
WriteShort(MSG_ONE, 30061);
WriteShort(MSG_ONE, 24946);
WriteShort(MSG_ONE, 8297);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_SHOGUN)
{
WriteShort(MSG_ONE, 26707);
WriteShort(MSG_ONE, 26479);
WriteShort(MSG_ONE, 28277);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_BALDER)
{
WriteShort(MSG_ONE, 24898);
WriteShort(MSG_ONE, 25708);
WriteShort(MSG_ONE, 29285);
WriteShort(MSG_ONE, 8224);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_ALIBABA)
{
WriteShort(MSG_ONE, 27713);
WriteShort(MSG_ONE, 8297);
WriteShort(MSG_ONE, 24898);
WriteShort(MSG_ONE, 24930);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_SANDSTORM)
{
WriteShort(MSG_ONE, 24915);
WriteShort(MSG_ONE, 25710);
WriteShort(MSG_ONE, 29811);
WriteShort(MSG_ONE, 29295);
WriteShort(MSG_ONE, 8301);
WriteByte(MSG_ONE, 32);
}
else if (r==ITEM_RUNE_WIND)
{
WriteShort(MSG_ONE, 26967);
WriteShort(MSG_ONE, 25710);
WriteShort(MSG_ONE, 21024);
WriteShort(MSG_ONE, 28277);
WriteShort(MSG_ONE, 8293);
WriteByte(MSG_ONE, 32);
}
else {
WriteShort(MSG_ONE, 28494);
WriteShort(MSG_ONE, 21024);
WriteShort(MSG_ONE, 28277);
WriteShort(MSG_ONE, 8293);
WriteShort(MSG_ONE, 8224);
WriteByte(MSG_ONE, 32);
}
};
// This prints a 3 digit number (any more than 3 digits and you'll just get
// 999). It always fills 3 columns, so, for example, printnum(43) will
// output " 43".
void(float f) printnum =
{
local float d1, d2, d3;
local float a,b,c;
if (f>999) f=999;
a=floor(f/10); a=a * 10; d1=f - a;
a=floor(f/100); a=a*100; a=f-(a+d1); d2=a/10;
d3=(f-(d1+(10*d2)))/100;
if (d3 == 0)
WriteByte(MSG_ONE, 32);
else
WriteByte(MSG_ONE, 48+d3);
if (d3 == 0 && d2 == 0)
WriteByte(MSG_ONE, 32);
else
WriteByte(MSG_ONE, 48+d2);
WriteByte(MSG_ONE, 48+d1);
};
// Print 11 newlines. You have to print the space because quake won't
// count the line unless it has non-zero length. These 11 lines get the
// "cursor" down to the bottom line on most screens. For people with
// higher resolutions, they can just turn off the status bar.
void() bottomline =
{
local float i;
i=0;
while (i<self.bottom_line)
{
WriteByte(MSG_ONE, 32);
WriteByte(MSG_ONE, 10);
i=i + 1;
}
};